//7．编写一个程序，打开和读取一个文本文件，并统计文件中每个单词出现的次数。
// 用改进的二叉查找树储存单词及其出现的次数。程序在读入文件后，会提供一个有3个选项的菜单。
// 第1个选项是列出所有的单词和出现的次数。
// 第2个选项是让用户输入一个单词，程序报告该单词在文件中出现的次数。第3个选项是退出。
#include <stdio.h>
#include <tree1.h>
#include <stdlib.h>
#include <string.h>
#include <mylib.h>

char menu();

void show_items(Item item) { printf("%80s%6d\n", item.string, item.size); };

int main(int size, char **argv) {
    char sel;
    FILE *file;
    char *filename;
    Tree tree;
    char word[MAXLEN];
    if (size < 2) {
        fputs("Usage p7 filename", stderr);
        exit(EXIT_FAILURE);
    }
    filename = argv[1];
    if ((file = fopen(filename, "r")) == NULL) {
        fputs("Can't open file", stderr);
        exit(EXIT_FAILURE);
    }
    InitializeTree(&tree);

    while (fscanf(file, "%80s", word) == 1) {
        Item item = {.size=1};
        strncpy(item.string,word,MAXLEN);
        Item *fi = findItem(&item, &tree);
        if (fi == NULL) {
            AddItem(&item, &tree);
        } else {
            fi->size++;
        }
    }
    fclose(file);
    while ((sel = menu()) != 'c') {
        if (sel == 'a') {
            printf("%80s%6s\n", "WORD", "TIMES");
            Traverse(&tree, show_items);
        } else {
            printf("Enter a word:");
            Item item = {.size=1};
            scanf("%s", item.string);
            eatline();
            Item *fi = findItem(&item, &tree);
            if (fi == NULL) {
                printf("Find no word");
            } else {
                printf("%20s%6d\n", fi->string, fi->size);
            }
        }
    }
    DeleteAll(&tree);
    puts("Bye!");
    return 0;
}

char menu() {
    printf("a)打印所有\tb)查找打印\tc)退出:");
    const int st_size = 10;
    char st[st_size];
    char chs[] = "a|b|c";
    while (s_gets(st, st_size) == NULL || strchr(chs, st[0]) == NULL) {
        printf("输入%s\n", chs);
    }
    return st[0];
}

